﻿#pragma once

#include <mutex>
#include <vector>

#include "ILogSink.h"

namespace Logging::Testing {
// 一个实现了 ILogSink 接口的模拟对象，用于捕获和验证日志消息。
class MockSink : public ILogSink {
 public:
  // 实现 ILogSink 的纯虚函数
  void Log(const LogMessageInfo& message) override {
    std::lock_guard<std::mutex> lock(mutex_);
    messages_.push_back(message);
  }

  // --- 测试辅助方法 ---

  // 获取捕获到的所有消息
  std::vector<LogMessageInfo> get_messages() const {
    std::lock_guard<std::mutex> lock(mutex_);
    return messages_;
  }

  // 获取捕获到的消息数量
  size_t count() const {
    std::lock_guard<std::mutex> lock(mutex_);
    return messages_.size();
  }

  // 清空已捕获的消息，以便在多个测试间复用
  void clear() {
    std::lock_guard<std::mutex> lock(mutex_);
    messages_.clear();
  }

 private:
  mutable std::mutex mutex_;  // 必须是 mutable，因为 const 方法也需要加锁
  std::vector<LogMessageInfo> messages_;
};
}  // namespace Logging::Testing
